# @Time : 2020/7/11 11:52
# @Author : Fioman 
# @Phone : 13149920693
"""
我们来了解一下__getitem__和切片的行为
"""


class MySeq(object):
    def __getitem__(self, index):
        return index


if __name__ == '__main__':
    s = MySeq()
    print("s[2] = {}".format(s[2]))
    print("s[1:4] = {}".format(s[1:4]))
    print("s[1:4:2] = {}".format(s[1:4:2]))
    print("s[1:4:2,7:9]".format(s[1:4:2, 7:9]))

    """
    1> 在这个示例中,__getitem__直接返回传给它的值
    2> 单个索引,没什么新奇的.
    3> 1:4 表示法变成了slice(1,4,None)
    4> slice(1,4,2) 的意思是从1开始,到4结束,步幅为2
    5> 神奇的事发生了:如果[]中有逗号,那么__getitem__收到的是元组
    6> 元组中甚至可以有多个切片对象.
    """

    print(slice)
    print(dir(slice))
    """
    1> 通过审查slice,发现它有start,stop和step数据属性,以及indices方法.
    """
    print(help(slice.indices))
    """
    给定长度为len的序列,计算S表示的扩展切片的起始(start)和结尾(stop)索引,以及步幅(stride).
    超出边界的索引会被截掉,这与常规切片的处理方式一样.
    换句话说,indices方法开放了内置序列实现的棘手逻辑,用于优雅地处理缺失索引和负数索引,以及长度炒股目标序列的切片.这个方法会整顿元组,把
    start,stop和stride都变成非负数,而且都落在指定长度序列的边界内.
    """